interface Module {

  init(): void

  boot(): void
}

abstract class ModuleAdapter implements Module {
  init(): void {
    console.log('before init...')
    this.doInit()
    console.log('after init...')
  }

  boot(): void {
    console.log('before boot...')
    this.doBoot()
    console.log('after boot...')
  }

  abstract doInit(): void
  abstract doBoot(): void
}

export {Module, ModuleAdapter}